<template>
  <div class="page-wrapper">
    <el-card class="card">
      <!-- 公司信息行 -->
      <TreeTools :data="companyInfo" :is-company="true" @showDialog="showDialog" />
      <!-- 分割线 -->
      <hr>
      <!-- 部门树形结构 -->
      <el-tree :data="treeData" default-expand-all>
        <!-- 每个节点都要重复使用的模板 -->
        <template v-slot="scope">
          <!-- 这里代码虽多, 只是一行的模板 el-tree 会负责遍历渲染 -->
          <!-- 每行数据结构, 都像顶部公司信息那样显示 -->
          <!-- 部门名称: {{ scope.data.name }} 负责人: {{ scope.data.manager }} -->
          <TreeTools :data="scope.data" @showDialog="showDialog" @reload="loadDepartmentList" @EidtshowDialog="EidtshowDialog" />
        </template>
      </el-tree>
    </el-card>
    <!-- 如果是按钮控制弹窗倒是简单,
    但是实际上现在咱们是 TreeTools 子组件控制弹窗 -->
    <!-- <el-button @click="isShowDialog = true">打开弹窗</el-button> -->
    <!-- <DeptDialog :is-show-dialog="isShowDialog" :data="data" @reload="loadList" @close="isShowDialog = false" /> -->
    <!--
      sync 修饰符固定写法, 父组件部分, 只要子组件有 update:props字段名
      父组件就可以在这个字段中添加 .sync 修饰符让对应的数据改为子组件传出的值
     -->
     <DeptDialog ref="deptDialog" :is-show-dialog.sync="isShowDialog" :data="data" @reload="loadDepartmentList" />
  </div>
</template>

<script>
import TreeTools from './components/tree-tools.vue'
import {getDepartmentList,detailDepartment} from '@/api/department'

import DeptDialog from '@/views/departments/components/dept-dialog.vue'
import {listToTree} from '@/utils/index'
export default {
  components:{
      TreeTools,
      DeptDialog
  },
  data(){
    return {
         // 部门有数据, 但是公司没有数据对象, 就不方便复用组件
         companyInfo: {
        name: '传值教育黑马程序员',
        manager: '负责人',
        id:''
      },
      treeData: [],
      isShowDialog:false
    }
},

created(){
  this.loadDepartmentList()
},

methods:{
  // 查询部门列表
  async loadDepartmentList(){
    // const res=await getDepartmentList()
    // 可以用解构 
     const {depts}=await getDepartmentList()
    // console.log(res)
    // this.treeData=depts
    // this.treeData=res.depts
// 这里的数据不符合要求需要转换
      // 我们封装一个函数, 希望输入不合法数据, 输出可以使用的结果
      this.treeData = listToTree(depts, '')
    },
// 新增
    showDialog(data){
      this.data=data
      console.log('父组件接收点击的部门数据',data)
      this.isShowDialog=true
    },
    // 编辑---数据回填
   async EidtshowDialog(data){
    console.log('被点击编辑的弹窗数据',data);
    const res =await detailDepartment(data.id)
    console.log('点击编辑时从后端拿到的详细数据',res);

     // 这里是中间桥梁, 树形点击, 将数据传过来, 这里发起请求
      // 获取到详情, 最终要交给弹窗组件formData进行回显
      // 由于子组件的formData 是用户需要填写的, 不能用 props 传值
      // 其实 vue 有一个功能, 通过 this.$refs 可以得到子组件的实例 this
      // 直接调用里面的函数或者直接修改里面的数据都是可以的
    this.$refs.deptDialog.formData=res
      this.isShowDialog=true
    }
  
  }
}
</script>

<style lang="scss" scoped>
.card {
  padding: 30px 140px;
}
.dropdown-btn {
  cursor: pointer;
}
.info {
  width: 100%;
}
</style>